import debounce from 'lodash/debounce';
import moment from 'moment';
import request from '@/utils/request';
import { setItem, getItem, operActionLog } from '@/utils/utils';
import mapping from '@/services/login';

/**
 * 记录操作轨迹日志.
 * create by zhouwenqing 2017/7/26 .
 */

// 填写各个中心自己的操作轨迹接受controller地址
const baseUrl = 'portal/TraceInfoController';
const traceLogAction = {
  baseUrl,
  /**
   * 开启一个新的计时器.
   * 返回一个用于记录操作时长的对象，调用对象上的duration方法，返回时间差.
   */
  newStopwatch() {
    return new (function() {
      const self = this;
      this.beginTime = new Date().getTime();

      /**
       * 返回时长，从调用newStopwatch到调用duration方法之间的时长.
       * @return {number}
       */
      this.duration = function() {
        return new Date().getTime() - self.beginTime;
      };
    })();
  },
  /**
   * 开始记录用户的最新的操作时间
   * 以lastOpDate保存在session storage中
   */
  start() {
    setItem('lastOpDate', moment().format('YYYY-MM-DD HH:mm:ss'));

    // 防止重复绑定
    traceLogAction.stop();
    // 开始监听
    window.addEventListener('click', traceLogAction.updateLastOpDate);
    window.addEventListener('keydown', traceLogAction.updateLastOpDate);
    window.addEventListener('mousemove', traceLogAction.updateLastOpDate);
  },
  stop() {
    window.removeEventListener('click', traceLogAction.updateLastOpDate);
    window.removeEventListener('keydown', traceLogAction.updateLastOpDate);
    window.removeEventListener('mousemove', traceLogAction.updateLastOpDate);
  },
  updateLastOpDate: debounce(() => {
    if (getItem('status') === mapping.LOGINED) {
      setItem('lastOpDate', moment().format('YYYY-MM-DD HH:mm:ss'));
    }
  }, 500),
  /**
   * 调用controller总入口方法.
   * @param {object} params
   *  {
   *    "accNum": "18050417049",
   *    "centerCode": "13",
   *    "menuId": 1,
   *    "menuName": "权限管理",
   *    "serviceCode": "413010010001",
   *    "serviceName": "新增权限",
   *    "operDuration": 2000,
   *    "operStatus": "成功",
   *    "comment": "",
   *    "serviceContent": {
   *       "privId": 1,
   *       "privName": "查询权限"
   *     }
   * }
   * @param {function} success
   */
  traceLog(params, success) {
    return request(`${baseUrl}/traceLog.do`, {
      method: 'post',
      data: { ...params, ignoreSession: true },
    }).then(res => typeof success === 'function' && success(res));
  },
  /**
   * 记录菜单点击操作.
   * 打开菜单的时候调用这个方法，传入menuId和menuName，然后在调用traceLog总入口方法。
   * @param params{
   * "menuId":
   * "menuName":
   * }
   * @param success
   */
  traceOpenMenuLog(params, success) {
    // 调用新的日志记录方法
    operActionLog({
      actionType: '1000',
      actionModule: params.menuId,
      action: '1000',
      handResult: '',
      actionMsg: '',
    });
    return traceLogAction.traceLog(
      {
        serviceCode: '413010060001',
        serviceName: '打开菜单页面',
        operStatus: '成功',
        ...params,
      },
      success
    );
  },
  /**
   * 记录菜单点击操作.
   * 关闭菜单的时候调用这个方法，传入menuId和menuName，然后在调用traceLog总入口方法。
   * @param params{
   * "menuId":
   * "menuName":
   * }
   * @param success
   */
  // traceCloseMenuLog(params, success) {
  //   params = $.extend(
  //     {
  //       serviceCode: '413010060002',
  //       serviceName: '关闭菜单页面',
  //       operStatus: '成功',
  //     },
  //     params
  //   );
  //   return traceLogAction.traceLog(params, success);
  // },

  /**
   * 记录操作员登录操作轨迹..
   * @param params{
   * "operDuration":
   * }
   * @param success
   */
  traceLoginInfo(params, success) {
    params = $.extend(
      {
        serviceCode: '413010050001',
        serviceName: '登录系统',
        operStatus: '成功',
      },
      params
    );
    return traceLogAction.traceLog(params, success);
  },
  /**
   * 记录操作员登出操作轨迹..
   * @param params{
   * "operDuration":
   * }
   * @param success
   */
  traceLogoutInfo(params, success) {
    params = $.extend(
      {
        serviceCode: '413010050002',
        serviceName: '登出系统',
        operStatus: '成功',
      },
      params
    );
    return traceLogAction.traceLog(params, success);
  },
};

export default traceLogAction;
